#include "ST7789.h"
#include "Debug.h"

#define ips154_write_8bit_data_spi(data) (ST7789_WriteByte(data))
#define ips154_write_16bit_data_spi(data) (ST7789_Write2Byte(data))

static uint16_t ips_show_h = LCD_H;                        // 屏幕高
static uint16_t ips_show_w = LCD_W;                        // 屏幕宽
static uint16_t ips154_pencolor = IPS154_DEFAULT_PENCOLOR; // 画笔颜色(字体色)
static uint16_t ips154_bgcolor = IPS154_DEFAULT_BGCOLOR; // 背景颜色
static ips154_font_size_enum ips154_display_font =
    IPS154_DEFAULT_DISPLAY_FONT; // 显示字体类型

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     发送一个字节（根据平台自行实现）
// 参数说明     TxData           	发送字节
// 返回参数     void
// 使用示例     ST7789_WriteByte(0xff);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ST7789_WriteByte(uint8_t TxData) {
  DL_SPI_transmitData8(SPI_INST, TxData);
  while (DL_SPI_isBusy(SPI_INST))
    ;
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     发送两个字节（根据平台自行实现）
// 参数说明     TxData           	发送字节
// 返回参数     void
// 使用示例     ST7789_Write2Byte(RGB565_BLACK);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ST7789_Write2Byte(uint16_t TxData) {
  DL_SPI_transmitData8(SPI_INST, (uint8_t)((TxData & 0xFF00) >> 8));
  while (DL_SPI_isBusy(SPI_INST))
    ;
  DL_SPI_transmitData8(SPI_INST, (uint8_t)(TxData & 0x00FF));
  while (DL_SPI_isBusy(SPI_INST))
    ;
}

//-------------------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 写命令
// 参数说明     command         命令
// 返回参数     void
// 使用示例     ips154_write_command(0x2a);
// 备注信息     内部调用 用户无需关心
//-------------------------------------------------------------------------------------------------------------------
static void ips154_write_command(const uint8_t command) {
  IPS154_DC(0);
  ips154_write_8bit_data_spi(command);
  IPS154_DC(1);
}

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     设置显示区域
// 参数说明     x1              起始x轴坐标
// 参数说明     y1              起始y轴坐标
// 参数说明     x2              结束x轴坐标
// 参数说明     y2              结束y轴坐标
// 返回参数     void
// 使用示例     ips154_set_region(0, 0, ips154_width_max - 1, ips154_height_max
// - 1); 备注信息     内部调用 用户无需关心
//-------------------------------------------------------------------------------------------------------------------
static void ips154_set_region(uint16_t x1, uint16_t y1, uint16_t x2,
                              uint16_t y2) {

  ips154_write_command(0x2a);
  ips154_write_16bit_data_spi(x1);
  ips154_write_16bit_data_spi(x2);

  ips154_write_command(0x2b);
  ips154_write_16bit_data_spi(y1);
  ips154_write_16bit_data_spi(y2);

  ips154_write_command(0x2c);
}

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 清屏函数
// 参数说明     void
// 返回参数     void
// 使用示例     ips154_clear();
// 备注信息     将屏幕清空成背景颜色
//-------------------------------------------------------------------------------------------------------------------
void ips154_clear(void) {
  uint32_t i = ips_show_w * ips_show_h;
  IPS154_CS(0);
  ips154_set_region(0, 0, ips_show_w - 1, ips_show_h - 1);
  for (; i != 0; i--) {
    ips154_write_16bit_data_spi(ips154_bgcolor);
  }
  IPS154_CS(1);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 屏幕填充函数
// 参数说明     color           颜色格式 RGB565 或者可以使用 zf_common_font.h 内
// rgb565_color_enum 枚举值或者自行写入 返回参数     void 使用示例
// ips154_full(RGB565_BLACK); 备注信息     将屏幕填充成指定颜色
//-------------------------------------------------------------------------------------------------------------------
void ips154_full(const uint16_t color) {
  uint32_t i = ips_show_w * ips_show_h;
  IPS154_CS(0);
  ips154_set_region(0, 0, ips_show_w - 1, ips_show_h - 1);
  for (; i != 0; i--) {
    ips154_write_16bit_data_spi(color);
  }
  IPS154_CS(1);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     设置显示颜色
// 参数说明     pen             颜色格式 RGB565 或者可以使用 zf_common_font.h 内
// rgb565_color_enum 枚举值或者自行写入 参数说明     bgcolor         颜色格式
// RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数     void
// 使用示例     ips154_set_color(RGB565_RED, RGB565_GRAY);
// 备注信息     字体颜色和背景颜色也可以随时自由设置 设置后生效
//-------------------------------------------------------------------------------------------------------------------
void ips154_set_color(uint16_t pen, const uint16_t bgcolor) {
  ips154_pencolor = pen;
  ips154_bgcolor = bgcolor;
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 画点
// 参数说明     x               坐标x方向的起点 [0, ips154_width_max-1]
// 参数说明     y               坐标y方向的起点 [0, ips154_height_max-1]
// 参数说明     color           颜色格式 RGB565 或者可以使用 zf_common_font.h 内
// rgb565_color_enum 枚举值或者自行写入 返回参数     void 使用示例
// ips154_draw_point(0, 0, RGB565_RED);            //坐标0,0画一个红色的点
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips154_draw_point(uint16_t x, uint16_t y, const uint16_t color) {
  IPS154_CS(0);
  ips154_set_region(x, y, x, y);
  ips154_write_16bit_data_spi(color);
  IPS154_CS(1);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 画线
// 参数说明     x_start         坐标x方向的起点 [0, ips154_width_max-1]
// 参数说明     y_start         坐标y方向的起点 [0, ips154_height_max-1]
// 参数说明     x_end           坐标x方向的终点 [0, ips154_width_max-1]
// 参数说明     y_end           坐标y方向的终点 [0, ips154_height_max-1]
// 参数说明     color           颜色格式 RGB565 或者可以使用 zf_common_font.h 内
// rgb565_color_enum 枚举值或者自行写入 返回参数     void 使用示例
// ips154_draw_line(0, 0, 10, 10, RGB565_RED);     // 坐标 0,0 到 10,10
// 画一条红色的线 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips154_draw_line(uint16_t x_start, uint16_t y_start, uint16_t x_end,
                      uint16_t y_end, const uint16_t color) {
  uint16_t x_dir = (x_start < x_end ? 1 : -1);
  uint16_t y_dir = (y_start < y_end ? 1 : -1);
  float temp_rate = 0;
  float temp_b = 0;
  do {
    if (x_start != x_end) {
      temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end);
      temp_b = (float)y_start - (float)x_start * temp_rate;
    } else {
      while (y_start != y_end) {
        ips154_draw_point(x_start, y_start, color);
        y_start += y_dir;
      }
      ips154_draw_point(x_start, y_start, color);
      break;
    }

    if (abs(y_start - y_end) > abs(x_start - x_end)) {
      while (y_start != y_end) {
        ips154_draw_point(x_start, y_start, color);
        y_start += y_dir;
        x_start = (int16_t)(((float)y_start - temp_b) / temp_rate);
      }
      ips154_draw_point(x_start, y_start, color);
    } else {
      while (x_start != x_end) {
        ips154_draw_point(x_start, y_start, color);
        x_start += x_dir;
        y_start = (int16_t)((float)x_start * temp_rate + temp_b);
      }
      ips154_draw_point(x_start, y_start, color);
    }
  } while (0);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 绘制长方形
// 参数说明     起点坐标，宽，高，是否填充，颜色
//-------------------------------------------------------------------------------------------------------------------
void ips154_draw_rectangle(uint16_t x_start, uint16_t y_start, uint16_t width,
                           uint16_t height, uint8_t filled,
                           const uint16_t color) {
  uint16_t x_end = x_start + width;
  uint16_t y_end = y_start + height;
  if (x_start > ips_show_w || y_start > ips_show_h || x_end > ips_show_w ||
      y_end > ips_show_h) {
    Debug("Input exceeds the normal display range\r\n");
    return;
  }
  if (filled) {
    for (uint16_t Ypoint = y_start; Ypoint < y_end; Ypoint++) {
      ips154_draw_line(x_start, Ypoint, x_end, Ypoint, color);
    }
  } else {
    ips154_draw_line(x_start, y_start, x_start + width, y_start, color);
    ips154_draw_line(x_start, y_start + height, x_start + width,
                     y_start + height, color);
    ips154_draw_line(x_start + width, y_start, x_start + width,
                     y_start + height, color);
    ips154_draw_line(x_start, y_start, x_start, y_start + height, color);
  }
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 绘制圆形
// 参数说明     中心坐标，直径，是否填充，颜色
//-------------------------------------------------------------------------------------------------------------------
void ips154_draw_circle(uint16_t x_center, uint16_t y_center, uint16_t radius,
                        uint8_t filled, const uint16_t color) {
  if (x_center > ips_show_w || y_center >= ips_show_h) {
    Debug("Paint_DrawCircle Input exceeds the normal display range\r\n");
    return;
  }

  // Draw a circle from(0, R) as a starting point
  int16_t XCurrent, YCurrent;
  XCurrent = 0;
  YCurrent = radius;

  // Cumulative error,judge the next point of the logo
  int16_t Esp = 3 - (radius << 1);

  int16_t sCountY;
  if (filled) {
    while (XCurrent <= YCurrent) // Realistic circles
    {
      for (sCountY = XCurrent; sCountY <= YCurrent; sCountY++) {
        ips154_draw_point(x_center + XCurrent, y_center + sCountY, color); // 1
        ips154_draw_point(x_center - XCurrent, y_center + sCountY, color); // 2
        ips154_draw_point(x_center - sCountY, y_center + XCurrent, color); // 3
        ips154_draw_point(x_center - sCountY, y_center - XCurrent, color); // 4
        ips154_draw_point(x_center - XCurrent, y_center - sCountY, color); // 5
        ips154_draw_point(x_center + XCurrent, y_center - sCountY, color); // 6
        ips154_draw_point(x_center + sCountY, y_center - XCurrent, color); // 7
        ips154_draw_point(x_center + sCountY, y_center + XCurrent, color);
      }
      if (Esp < 0)
        Esp += 4 * XCurrent + 6;
      else {
        Esp += 10 + 4 * (XCurrent - YCurrent);
        YCurrent--;
      }
      XCurrent++;
    }
  } else // Draw a hollow circle
  {
    while (XCurrent <= YCurrent) {
      ips154_draw_point(x_center + XCurrent, y_center + YCurrent, color); // 1
      ips154_draw_point(x_center - XCurrent, y_center + YCurrent, color); // 2
      ips154_draw_point(x_center - YCurrent, y_center + XCurrent, color); // 3
      ips154_draw_point(x_center - YCurrent, y_center - XCurrent, color); // 4
      ips154_draw_point(x_center - XCurrent, y_center - YCurrent, color); // 5
      ips154_draw_point(x_center + XCurrent, y_center - YCurrent, color); // 6
      ips154_draw_point(x_center + YCurrent, y_center - XCurrent, color); // 7
      ips154_draw_point(x_center + YCurrent, y_center + XCurrent, color); // 0

      if (Esp < 0)
        Esp += 4 * XCurrent + 6;
      else {
        Esp += 10 + 4 * (XCurrent - YCurrent);
        YCurrent--;
      }
      XCurrent++;
    }
  }
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 显示字符
// 参数说明     x               坐标x方向的起点 参数范围 [0, ips154_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0,
// ips154_height_max-1] 参数说明     dat             需要显示的字符 返回参数
// void 使用示例     ips154_show_char(0, 0, 'x');                     //
// 坐标0,0写一个字符x 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips154_show_char(uint16_t x, uint16_t y, const char dat) {
  uint8_t i = 0, j = 0;
  IPS154_CS(0);
  switch (ips154_display_font) {
  case IPS154_6X8_FONT:
    ips154_set_region(x, y, x + 5, y + 7);
    for (i = 0; 8 > i; i++) {
      for (j = 0; 6 > j; j++) {
        // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32
        uint8_t temp_top = ascii_font_6x8[dat - 32][j];
        if (temp_top & (0x01 << i)) {
          ips154_write_16bit_data_spi(ips154_pencolor);
        } else {
          ips154_write_16bit_data_spi(ips154_bgcolor);
        }
        temp_top >>= 1;
      }
    }
    break;
  case IPS154_8X16_FONT:
    ips154_set_region(x, y, x + 7, y + 15);

    for (i = 0; 8 > i; i++) {
      for (j = 0; 8 > j; j++) {
        uint8_t temp_top = ascii_font_8x16[dat - 32][j];
        if (temp_top & (0x01 << i)) {
          ips154_write_16bit_data_spi(ips154_pencolor);
        } else {
          ips154_write_16bit_data_spi(ips154_bgcolor);
        }
        temp_top >>= 1;
      }
    }
    for (i = 0; 8 > i; i++) {
      for (j = 8; 16 > j; j++) {
        uint8_t temp_bottom = ascii_font_8x16[dat - 32][j];
        if (temp_bottom & (0x01 << i)) {
          ips154_write_16bit_data_spi(ips154_pencolor);
        } else {
          ips154_write_16bit_data_spi(ips154_bgcolor);
        }
        temp_bottom >>= 1;
      }
    }
    break;
  default:
    break;
  }
  IPS154_CS(1);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 显示字符串
// 参数说明     x               坐标x方向的起点 参数范围 [0, ips154_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0,
// ips154_height_max-1] 参数说明     dat             需要显示的字符串 返回参数
// void 使用示例     ips154_show_string(0, 0, "seekfree"); 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips154_show_string(uint16_t x, uint16_t y, const char dat[]) {
  uint16_t j = 0;
  while ('\0' != dat[j]) {
    switch (ips154_display_font) {
    case IPS154_6X8_FONT:
      ips154_show_char(x + 6 * j, y, dat[j]);
      break;
    case IPS154_8X16_FONT:
      ips154_show_char(x + 8 * j, y, dat[j]);
      break;
    case IPS154_16X16_FONT:
      break; // 暂不支持
    }
    j++;
  }
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 显示32位有符号 (去除整数部分无效的0)
// 参数说明     x               坐标x方向的起点 参数范围 [0, ips154_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0,
// ips154_height_max-1] 参数说明     dat             需要显示的变量 数据类型
// int32 参数说明     num             需要显示的位数 最高10位  不包含正负号
// 返回参数     void
// 使用示例     ips154_show_int(0, 0, x, 3);                    // x 可以为
// int32 int16 int8 类型 备注信息     负数会显示一个 ‘-’号
//-------------------------------------------------------------------------------------------------------------------
void ips154_show_int(uint16_t x, uint16_t y, const int32_t dat, uint8_t num) {
  int32_t dat_temp = dat;
  int32_t offset = 1;
  char data_buffer[12];

  memset(data_buffer, 0, 12);
  memset(data_buffer, ' ', num + 1);

  // 用来计算余数显示 123 显示 2 位则应该显示 23
  if (10 > num) {
    for (; 0 < num; num--) {
      offset *= 10;
    }
    dat_temp %= offset;
  }
  func_int_to_str(data_buffer, dat_temp);
  ips154_show_string(x, y, (const char *)&data_buffer);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 显示32位无符号 (去除整数部分无效的0)
// 参数说明     x               坐标x方向的起点 参数范围 [0, ips114_x_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0, ips114_y_max-1]
// 参数说明     dat             需要显示的变量 数据类型 uint32
// 参数说明     num             需要显示的位数 最高10位  不包含正负号
// 返回参数     void
// 使用示例     ips154_show_uint(0, 0, x, 3);                   // x 可以为
// uint32 uint16 uint8 类型 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips154_show_uint(uint16_t x, uint16_t y, const uint32_t dat, uint8_t num) {
  uint32_t dat_temp = dat;
  int32_t offset = 1;
  char data_buffer[12];
  memset(data_buffer, 0, 12);
  memset(data_buffer, ' ', num);

  // 用来计算余数显示 123 显示 2 位则应该显示 23
  if (10 > num) {
    for (; 0 < num; num--) {
      offset *= 10;
    }
    dat_temp %= offset;
  }
  func_uint_to_str(data_buffer, dat_temp);
  ips154_show_string(x, y, (const char *)&data_buffer);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 显示浮点数(去除整数部分无效的0)
// 参数说明     x               坐标x方向的起点 参数范围 [0, ips154_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0,
// ips154_height_max-1] 参数说明     dat             需要显示的变量 数据类型
// double 参数说明     num             整数位显示长度   最高8位 参数说明
// pointnum        小数位显示长度   最高6位 返回参数     void 使用示例
// ips154_show_float(0, 0, x, 2, 3);               // 显示浮点数   整数显示2位
// 小数显示三位 备注信息
// 特别注意当发现小数部分显示的值与你写入的值不一样的时候，
//              可能是由于浮点数精度丢失问题导致的，这并不是显示函数的问题，
//              有关问题的详情，请自行百度学习   浮点数精度丢失问题。
//              负数会显示一个 ‘-’号
//-------------------------------------------------------------------------------------------------------------------
void ips154_show_float(uint16_t x, uint16_t y, const double dat, uint8_t num,
                       uint8_t pointnum) {
  double dat_temp = dat;
  double offset = 1.0;
  char data_buffer[17];
  memset(data_buffer, 0, 17);
  memset(data_buffer, ' ', num + pointnum + 2);

  // 用来计算余数显示 123 显示 2 位则应该显示 23
  for (; 0 < num; num--) {
    offset *= 10;
  }
  dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset;
  func_double_to_str(data_buffer, dat_temp, pointnum);
  ips154_show_string(x, y, data_buffer);
}

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     IPS154 绘图  image2LCD  水平扫描，高位在前
// 参数说明     color           颜色格式 RGB565 或者可以使用 zf_common_font.h 内
// rgb565_color_enum 枚举值或者自行写入 返回参数     void 使用示例
//
//-------------------------------------------------------------------------------------------------------------------
void ips154_draw_image(uint16_t x_start, uint16_t y_start, uint16_t x_end,
                       uint16_t y_end, const uint8_t *imgBuf) {
  uint32_t sum = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;
  IPS154_CS(0);
  ips154_set_region(x_start, y_start, x_end, y_end);
  for (uint32_t i = 0; i < sum; i++) {
    ips154_write_8bit_data_spi(imgBuf[i]);
  }
  IPS154_CS(1);
}

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     2寸 IPS液晶初始化
// 返回参数     void
// 使用示例     ips154_init();
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips154_init(void) {
  ips154_set_color(ips154_pencolor, ips154_bgcolor);

  IPS154_RES(0);
  Delay_ms(5);

  IPS154_RES(1);
  Delay_ms(120);
  IPS154_CS(0);

  ips154_write_command(0x11);
  Delay_ms(120);

  ips154_write_command(0x36);
  switch (IPS154_DEFAULT_DISPLAY_DIR) {
  case IPS154_PORTAIT:
    ips154_write_8bit_data_spi(0x00);
    break;
  case IPS154_PORTAIT_180:
    ips154_write_8bit_data_spi(0xC0);
    break;
  case IPS154_CROSSWISE:
    ips154_write_8bit_data_spi(0x70);
    ips_show_h = LCD_W;
    ips_show_w = LCD_H;
    break;
  case IPS154_CROSSWISE_180:
    ips154_write_8bit_data_spi(0xA0);
    ips_show_h = LCD_W;
    ips_show_w = LCD_H;
    break;
  }

  ips154_write_command(0x3A);
  ips154_write_8bit_data_spi(0x05);

  ips154_write_command(0xB2);
  ips154_write_8bit_data_spi(0x0C);
  ips154_write_8bit_data_spi(0x0C);
  ips154_write_8bit_data_spi(0x00);
  ips154_write_8bit_data_spi(0x33);
  ips154_write_8bit_data_spi(0x33);

  ips154_write_command(0xB7);
  ips154_write_8bit_data_spi(0x35);

  ips154_write_command(0xBB);
  ips154_write_8bit_data_spi(0x29); // 32 Vcom=1.35V

  ips154_write_command(0xC2);
  ips154_write_8bit_data_spi(0x01);

  ips154_write_command(0xC3);
  ips154_write_8bit_data_spi(0x19); // GVDD=4.8V

  ips154_write_command(0xC4);
  ips154_write_8bit_data_spi(0x20); // VDV, 0x20:0v

  ips154_write_command(0xC5);
  ips154_write_8bit_data_spi(0x1A); // VCOM Offset Set

  ips154_write_command(0xC6);
  ips154_write_8bit_data_spi(0x01F); // 0x0F:60Hz

  ips154_write_command(0xD0);
  ips154_write_8bit_data_spi(0xA4);
  ips154_write_8bit_data_spi(0xA1);

  ips154_write_command(0xE0);
  ips154_write_8bit_data_spi(0xD0);
  ips154_write_8bit_data_spi(0x08);
  ips154_write_8bit_data_spi(0x0E);
  ips154_write_8bit_data_spi(0x09);
  ips154_write_8bit_data_spi(0x09);
  ips154_write_8bit_data_spi(0x05);
  ips154_write_8bit_data_spi(0x31);
  ips154_write_8bit_data_spi(0x33);
  ips154_write_8bit_data_spi(0x48);
  ips154_write_8bit_data_spi(0x17);
  ips154_write_8bit_data_spi(0x14);
  ips154_write_8bit_data_spi(0x15);
  ips154_write_8bit_data_spi(0x31);
  ips154_write_8bit_data_spi(0x34);

  ips154_write_command(0xE1);
  ips154_write_8bit_data_spi(0xD0);
  ips154_write_8bit_data_spi(0x08);
  ips154_write_8bit_data_spi(0x0E);
  ips154_write_8bit_data_spi(0x09);
  ips154_write_8bit_data_spi(0x09);
  ips154_write_8bit_data_spi(0x15);
  ips154_write_8bit_data_spi(0x31);
  ips154_write_8bit_data_spi(0x33);
  ips154_write_8bit_data_spi(0x48);
  ips154_write_8bit_data_spi(0x17);
  ips154_write_8bit_data_spi(0x14);
  ips154_write_8bit_data_spi(0x15);
  ips154_write_8bit_data_spi(0x31);
  ips154_write_8bit_data_spi(0x34);

  ips154_write_command(0x21);

  ips154_write_command(0x29);

  IPS154_CS(1);

  ips154_clear(); // 初始化为白屏
}